package metier.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import metier.Eleve;
import metier.Stage;
import configuration.MessageAppli;


public class StageJdbc {
	
	private StageJdbc(){
	}
	
	/**
	 * Ajout un stage en base.
	 * @param Connection connexion à la base
	 * @param Stage Le stage a inserer
	 * @return boolean
	 */
	public static boolean ajouter(Connection c, Stage stage) {
		// préparer la requete sql 
		// retourne un entier égal à 1 
		//si l’insertion en base de données  a été réalisée
		int res = 0;
		try {
			PreparedStatement ps=c.prepareStatement("INSERT INTO stage (libellestage, dateDebut, datefin, idcategorie) VALUES (?,?,?,?) ");
			//affecter les values correspondant aux colonnes
			ps.setString(1, stage.getLibelleStage());
			ps.setDate(2, new java.sql.Date(stage.getDateDebut().getTime()));
			ps.setDate(3, new java.sql.Date(stage.getDateFin().getTime()));
			ps.setInt(4, stage.getIdCategorie());
			res = ps.executeUpdate();
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return res==1;
	}
	
	/**
	 * Retourne la liste des stages en base.
	 * @param Connection connexion à la base
	 * @return <code>ArrayList<Stage><code> La liste des stages.
	 */
	public static ArrayList<Stage> getListeStage(Connection c) {
		ArrayList<Stage> lStage = new ArrayList<Stage>();
		// préparer la requete sql 
		try {
			PreparedStatement ps=c.prepareStatement("SELECT * FROM stage");

			//si l’insertion en base de données  a été réalisée.
			// Res commence par 1 et pas 0.
			ResultSet res = ps.executeQuery();
			while(res.next()){
				lStage.add(new Stage(res.getInt("idstage"), 
						res.getString("libellestage"),
						res.getDate("dateDebut"),
						res.getDate("dateFin"),
						res.getInt("idcategorie")));
			}
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		if ( lStage.isEmpty()){
			return null;
		}else{
			return lStage;
		}
	}
	
	/**
	 * Permet de modifier le nom d'un stage.
	 * @param Connection connexion à la base
	 * @param stage à rechercher
	 * @return stage
	 */
	public static boolean modifier(Connection c, Stage stage) {
		int res = 0;
		// préparer la requete sql 
		try {
			PreparedStatement ps=c.prepareStatement("UPDATE stage SET " +
					"libelleStage = ?, " +
					"dateDebut = ?, " +
					"dateFin = ?, " +
					"idcategorie = ? " +
					"where idStage = " + stage.getIdStage());
			ps.setString(1, stage.getLibelleStage());
			ps.setDate(2, new java.sql.Date(stage.getDateDebut().getTime()));
			ps.setDate(3, new java.sql.Date(stage.getDateFin().getTime()));
			ps.setInt(4, stage.getIdCategorie());
			//si l’insertion en base de données  a été réalisée.
			// Res commence par 1 et pas 0.
			res = ps.executeUpdate();
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return res == 1;
	}
	
	/**
	 * Recherche un stage par son nom.
	 * @param Connection connexion à la base
	 * @param stage à rechercher
	 * @return stage
	 */
	public static Stage rechercherStageByNom(Connection c, String nom) {
		Stage stageRes = null;
		// préparer la requete sql 
		try {
			PreparedStatement ps=c.prepareStatement("SELECT * FROM stage where libelleStage like '" + nom +"'");
			ResultSet res = ps.executeQuery();
			while(res.next()){
				stageRes = new Stage(res.getInt("idstage"), 
						res.getString("libellestage"),
						res.getDate("dateDebut"),
						res.getDate("dateFin"),
						res.getInt("idcategorie"));
			}
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return stageRes;
	}
	
	/**
	 * Verifie qu'un stage existe.
	 * @param Connection connexion à la base
	 * @param stage rechercher.
	 * @return retourne vrai si existe.
	 */
	public static boolean stageExisteByNom(Connection c, String nom){
		return rechercherStageByNom(c, nom) != null;
	}
	
	/**
	 * Renvoi la liste des Eleves d'un stage.
	 * @param c
	 * @param stage
	 * @return ArrayList<.Stage.>
	 */
	public static ArrayList<Eleve> rechercherListeStageEleve(Connection c, Stage stage){
		ArrayList<Eleve> lEleve = new ArrayList<Eleve>();
		try {
			PreparedStatement ps = c.prepareStatement("SELECT * FROM eleve WHERE idStage = " + stage.getIdStage());
			ResultSet res = ps.executeQuery();
			while(res.next()){
				lEleve.add(new Eleve(res.getInt("idEleve"),
						res.getString("nomEleve"),
						res.getString("prenom"),
						res.getDate("dateNaissance"),
						res.getInt("idGrade"),
						res.getInt("idStage"),
						res.getInt("idFonction")
						));
			}
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return lEleve;
	}
	
	/**
	 * Renvoi un stage par son id.
	 * @param c
	 * @param id stage.
	 * @return
	 */
	public static Stage rechercherById(Connection c, int id){
		Stage stage = null;
		try {
			PreparedStatement ps = c.prepareStatement("SELECT * FROM stage WHERE idstage = " + id);
			ResultSet res = ps.executeQuery();
			while(res.next()){
				stage = new Stage(res.getInt("idstage"), 
						res.getString("libellestage"),
						res.getDate("dateDebut"),
						res.getDate("dateFin"),
						res.getInt("idcategorie"));
				break;
			}
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return stage;
	}
	
	/**
	 * Suppression d'un stage.
	 * @param Connection connexion à la base
	 * @param occurence à supprimer.
	 * @return true ou false.
	 */
	public static boolean suppressionStage(Connection c, Stage stage) {
		try {
			PreparedStatement ps=c.prepareStatement("DELETE FROM stage WHERE idStage = " + stage.getIdStage());
			int res = ps.executeUpdate();
			ps.close();
			return res == 1;
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return false;
	}
}

